package cn.acac.yygh.user.controller.user;

import cn.acac.yygh.exception.MyException;
import cn.acac.yygh.model.user.UserInfo;
import cn.acac.yygh.result.R;
import cn.acac.yygh.user.pojo.Weixin;
import cn.acac.yygh.user.service.UserInfoService;
import cn.acac.yygh.user.utils.HttpClientUtils;
import cn.acac.yygh.utils.JwtHelper;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/user/userInfo/weixin")
public class WeixinController {

    @Autowired
    private Weixin weixin;

    @Autowired
    private UserInfoService userInfoService;

    /**
     * 获取微信登录的秘钥
     * @return
     */
    @ResponseBody
    @GetMapping("/getParams")
    public R getParams() throws UnsupportedEncodingException {
        // 将url进行编码
        String redirectUrl = URLEncoder.encode(weixin.getRedirectUrl(), "UTF-8");
        Map<String,Object> weixinMap = new HashMap<>();
        weixinMap.put("appid",weixin.getAppId());
        weixinMap.put("scope","snsapi_login");
        weixinMap.put("redirect_url",redirectUrl);
        weixinMap.put("status",System.currentTimeMillis() + "");
        return R.ok().setData(weixinMap);
    }

    /**
     * 微信回调方法
     * @return
     */
    @GetMapping("/callback")
    public String callback(String code,String state) throws Exception {
        StringBuilder stringBuilder = new StringBuilder();
        StringBuilder append = stringBuilder.append("https://api.weixin.qq.com/sns/oauth2/access_token?")
                .append("appid=%s")
                .append("&secret=%s")
                .append("&code=%s")
                .append("&grant_type=authorization_code");
        // 将占位符数据补充
        String url = String.format(append.toString(), weixin.getAppId(), weixin.getScope(), code);
        // 使用HttpClientUtils向微信服务器发送请求
        String result = HttpClientUtils.get(url);
        // 将结果转换为JSON格式
        JSONObject jsonObject = JSONObject.parseObject(result);
        String access_token = jsonObject.getString("access_token");
        String openid = jsonObject.getString("openid");

        // 根据openid查询数据库，判断用户是否第一次使用微信登录
        UserInfo userInfo = userInfoService.findUserInfoByOpenid(openid);
        // 判断userInfo是否为空
        if (StringUtils.isEmpty(userInfo)) {
            // 向微信服务器再次发送请求，获取用户的个人信息
            StringBuilder stringBuilder1 = new StringBuilder();
            StringBuilder append1 = stringBuilder1.append("https://api.weixin.qq.com/sns/userinfo?")
                    .append("access_token=%s")
                    .append("&openid=%s");
            String result1 = String.format(append1.toString(), access_token, openid);
            String s = HttpClientUtils.get(result1);
            // 将结果转换为JSON
            JSONObject jsonObject1 = JSONObject.parseObject(s);
            // 用户昵称
            String nickname = jsonObject1.getString("nickname");
            // 为空代表第一次使用微信登录
            userInfo = new UserInfo();
            // 将信息设置并保存数据库
            userInfo.setOpenid(openid);
            userInfo.setNickName(nickname);
            userInfo.setStatus(1);
            // 将数据保存到数据库中
            userInfoService.save(userInfo);
        }
        // 不是第一次登录进行验证
        //5.验证用户的status状态
        if(userInfo.getStatus() == 0){
            throw new MyException(50000,"用户已被锁定！");
        }
        //6.返回用户的信息
        Map<String,String> userInfoMap = new HashMap<>();
        // 第一次使用微信登录需要强制绑定手机
        if(StringUtils.isEmpty(userInfo.getPhone())){
            userInfoMap.put("openid",userInfo.getOpenid());
        }else {
            userInfoMap.put("openid","");
        }
        String name = null;
        // 进行一系列判断
        if(!StringUtils.isEmpty(userInfo.getName())){
            name = userInfo.getName();
            userInfoMap.put("name",name);
        }
        if(!StringUtils.isEmpty(userInfo.getPhone())){
            name = userInfo.getPhone();
            userInfoMap.put("name",name);
        }
        if(!StringUtils.isEmpty(userInfo.getNickName())){
            name = userInfo.getNickName();
            userInfoMap.put("name",name);
        }
        // 7.token的认证
        // 生成token
        String token = JwtHelper.createToken(userInfo.getId(), name);
        userInfoMap.put("token",token);
        //跳转到前端页面
        return "redirect:http://localhost:3000/weixin/callback?token="+userInfoMap.get("token")+ "&openid="+userInfoMap.get("openid")+"&name="+URLEncoder.encode(userInfoMap.get("name"),"utf-8");
    }
}
